MagnaMedia · AMIGA-Magazin · 3D-Zeug

Aktuelles Heft 4/97

In den Tiefen des Raums

Da Rechner immer mehr leisten, ist dreidimensionale Computergrafik zunehmend auch zu Hause keine Seltenheit. Eine geeignete Softwarel�sung f�r 3D hei�t �CyberGL� und l�uft auf Amigas. Dieser Kurs zeigt, wie's funktioniert und was dahintersteckt.
von Frank Gerberding
Falls Sie h�ufig mit all den merkw�rdigen Begriffen wie �Gouraudshading� oder �Antialiasing� konfrontiert werden, aber nicht so recht wissen, wozu das Ganze eigentlich gut sein soll, oder falls Sie eine Grafik-Bibliothek noch immer f�r einen gro�en Raum mit vielen B�chern halten, ist dieser erste Teil des Kurses genau die richtige Adresse f�r Sie. Ein paar mathematische Kenntnisse (lineare Algebra [1]) sollten Sie aber schon mitbringen. In dieser Folge werden die Grundlagen erkl�rt, die Sie f�r die weiteren Kursteile ben�tigen. Damit Sie den Workshop aktiv mitverfolgen k�nnen, finden Sie alle Quelltexte, Demobilder usw. auf der Heft-CD bzw. hier eine LHA-Datei mit Demos.

Es gibt im wesentlichen zwei Hauptprobleme bei 3-D-Grafik: Sie ist erstens teilweise �u�erst kompliziert und damit f�r die meisten Menschen normalerweise unzug�nglich und zweitens sind die auf dem Markt befindlichen Spezialchips zur Beschleunigung des Bildaufbaus so unterschiedlich, da� man f�r jede Grafikkarte und f�r jeden Computer eigentlich ein eigenes ganz spezielles Programm schreiben m��te. Diese beiden Nachteile lassen sich aber sehr einfach umgehen: man benutzt eine standardisierte Computergrafik-Bibliothek, die dem Benutzer die ganze Mathematik und Hardware abnimmt.

Inzwischen gibt es eine ganze Reihe solcher Standards, die jedoch um den Amiga bisher immer einen gro�en Bogen gemacht haben. Gl�cklicherweise ist nun einer dieser Standards (zumindest teilweise) auf unseren Lieblingscomputer �bertragen worden: �CyberGL�.

Die grafischen B�chereien

Doch zun�chst wollen wir einen Blick �ber den Zaun werfen und die gebr�uchlichsten Bibliotheken auf anderen Computern betrachten. Die verwendeten Fachbegriffe sind in unserem Glossar erkl�rt. Da haben wir zun�chst den Microsoft-Windows-Standard �Direct3D�, der zur Zeit von sich Reden macht. Direct3D ist zusammen mit vielen anderen Modulen (DirectDraw, DirectSound, DirectInput und DirectPlay) ein Teil von DirectX und soll besonders die Spieleprogrammierung vereinfachen. Der Standard bietet alle g�ngigen Features: Z-Buffer, Antialiasing, MIPmapping, perspektivkorrigiertes Texture-Mapping und auch Sprites. Direct3D wird mit ziemlicher Sicherheit der Standard auf PCs, allerdings auch nur auf PCs, da Direct3D eng mit Windows verwoben ist, wodurch Direct3D f�r den Amiga uninteressant ist � im Gegensatz zu �QuickDraw 3D� von Apple. Dieser Standard enth�lt neben den technischen Standard-Features der Konkurrenz das Dateiformat 3DMF (3D metafile) zum Austausch von 3D-Daten, ein Entwickler-Toolkit, einfache Erweiterbarkeit durch PlugIns und, wie von Apple nicht anders zu erwarten, sogar 3D-Benutzer-Interface Standard-Richtlinien.Wenn es nach Apple's W�nschen geht, gibt es QuickDraw 3D bald auf m�glichst vielen Plattformen, allerdings hat es bisher einen relativ niedrigen Bekanntheitsgrad und wird au�erhalb der Macintosh-Welt kaum unterst�tzt.

Ein weiterer Standard ist �PHIGS� (Programmers Hierarchical Interactive Graphics System), der sogar als ANSI- und ISO-Norm vorliegt. Allerdings ist auch schon PHIGS (bzw. PHIGS+), das aus dem steinalten GKS (Graphical Kernel System) hervorgegangen ist, in die Jahre gekommen und ist auf heutigen Systemen wenig zu finden.
Der Standard �Heidi� wird fast ausschlie�lich auf PCs vom Programm �3D-Studio-Maxx� verwendet. Bibliothek und Programm stammen beide von AutoDesk und wegen der zwingenden Verwendung von Microsofts Visual C++ f�r alle anderen Rechner v�llig uninteressant.
Der verbreitetste und wohl bekannteste Standard ist �OpenGL� (Open Graphics Library), die besonders durch die Verwendung auf aufgemotzten Computern der Firma �Silicon Graphics� (SGI) ihren Siegeszug angetreten hat. Obwohl die OpenGL nicht der m�chtigste der hier vorgestellten Standards ist, hat sie gerade durch ihre explizite Rechnerunabh�ngigkeit den Weg auf viele Plattformen (u.a. UNIX, Win95/NT, OS/2) gefunden. Durch CyberGL wird OpenGL nun auch in den Amiga implementiert.

Ein R�ckblick � die Geschichte von OpenGL

Die OpenGL ist vor einigen Jahren aus der nur f�r SGI-Computer erh�ltlichen �IrisGL� (GL) hervorgegangen, um Programme mit GL-Unterst�tzung einfach auf andere Rechner portieren zu k�nnen. Die Entwicklung von OpenGL wurde zwar von SGI angef�hrt, aber gerade um einen hohen Verbreitungsgrad zu erreichen, hatten weitere Hersteller von Soft- und Hardware Einflu� auf das Design der Bibliothek. Die an der Entwicklung beteiligten Firmen bilden zusammen das �Architecture Review Board� (ARB), da� vier mal im Jahr zusammenkommt, um �ber die Zukunft des Standards zu debattieren. Digital Equipment (DEC), IBM, Intel, Microsoft und Silicon Graphics sind st�ndige Mitglieder des ARB, w�hrend die Firmen Evans & Sutherland und Intergraph im Moment nur zeitlich begrenzt dazu geh�ren.

Standards, Lizenzen und Kompatibilit�t

Die Mitglieder des ARB stellen au�erdem sogenannte �Conformance Tests� zusammen, die jede Implementation der OpenGL erfolgreich durchlaufen mu�, bevor sie sich offiziell OpenGL nennen darf.
Diese Vorgehensweise wurde gew�hlt, um zu gew�hrleisten, da� auch OpenGL drin ist, wo OpenGL drauf steht. So stellt das ARB sicher, da� alle Versionen absolut kompatibel sind und gleiche Ergebnisse liefern. Diese Tests und der �brige Verwaltungsaufwand erzeugen selbstverst�ndlich Kosten, die durch Lizenzzahlungen beglichen werden. Je nach Art der Lizenz betr�gt der Preis einmalig 25000 bis 100000 Dollar und zus�tzlich f�nf Dollar pro verkaufter Kopie der Bibliothek. Gl�cklicherweise ist es erlaubt, eine OpenGL-Implementation zu ver�ffentlichen, die keine Conformance Tests durchlaufen hat und f�r die keine Lizenzen bezahlt wurden. Das aber nur solange sie nicht OpenGL genannt oder als vollst�ndige OpenGL-Implementation bezeichnet wird (daher auch der Name �CyberGL�). Die OpenGL bietet eine Menge an Funktionen � um die Anwendung noch komfortabler zu gestalten, steht ihr eine Reihe weiterer Bibliotheken zur Seite.
Dazu geh�rt die �Utility Library� (GLU), deren Funktionen auf der OpenGL aufbauen und das objektorientierte Werkzeug �OpenInventor�, das auch eine Szenenbeschreibung als Text- und Bin�rdatei schreiben und lesen kann. Beide stehen bisher leider in der CyberGL-Implementation nicht zur Verf�gung, wenn auch die wichtigsten Funktionen direkt in die CyberGL integriert wurden. Das OpenInventor-Format ist sogar gleichzeitig Grundlage f�r den Standard VRML (Virtual Reality Modeling Language), der zur Beschreibung 3-D-Szenen im World Wide Web (WWW) verwendet wird.

OpenGL im Detail

Kommen wir nun zur OpenGL selbst. Da sie auf jedem Rechnertyp lauff�hig sein soll, enth�lt sie weder Funktionen zur Fensterverwaltung, noch zur Eingabe per Maus oder Tastatur oder zur Datei-Ein-/Ausgabe. Alle diese Funktionen mu� das OS der jeweiligen Plattform zur Verf�gung stellen und die Verbindung zwischen OpenGL und z.B. einem Fenster ist damit vom verwendeten Rechner abh�ngig.

Wenden wir uns daher den Eigenschaften der OpenGL zu, die f�r jede OpenGL-Version identisch sind. Da die Bibliothek m�glichst universell einsetzbar sein soll, werden keine Objekte verwaltet, die �in einem Rutsch� gezeichnet werden, sondern es werden grunds�tzlich immer alle Punkte, Linien, Polygone (in der OpenGL hei�en sie �Primitive�) usw. sofort gezeichnet, nachdem man sie der OpenGL bekannt gemacht hat und gleich anschlie�end �vergi�t� sie sie wieder. Die Applikation ist also f�r die Primitive-Verwaltung verantwortlich. Daf�r gibt es aber eine Flut von Einstellungen, die die Art der Darstellung von Primitiven beeinflussen. Diese Einstellungen lassen sich (fast) jederzeit �ndern und wirken sich auf alle nachfolgenden Zeichenoperationen aus. Die aktuellen Einstellungen bilden zusammen einen sogenannten Kontext � der Benutzer kann beliebig viele erzeugen und zwischen ihnen umschalten. Da der aktuelle Kontext eine Art Statusinformation darstellt, spricht man bei der OpenGL auch von einer �State Machine� � im Gegensatz zu objektorientierten Bibliotheken wie z.B. Quickdraw 3D, bei denen die 3-D-Objekte ihre Eigenschaften mit sich f�hren.

Das Grundkonzept eines OpenGL-Programms:

Zun�chst erzeugt man einen Kontext, �ffnet ein Fenster und verbindet beide miteinander. Dann nimmt man abwechselnd am Kontext alle m�glichen Einstellungen vor und zeichnet eine Reihe von Primitiven. Zum Schlu� gibt man den Kontext frei und schlie�t wie gewohnt das Fenster. Nun stellt sich nat�rlich die Frage, welche Primitive es gibt und wie diese der OpenGL �bergeben werden. Es gibt drei verschiedene Arten von Primitiven: Punkte, Linien und Polygone. Diese werden auf zehn unterschiedliche Arten spezifiziert.

Zu Beginn wollen wir uns jedoch auf Dreiecke beschr�nken, um den Mechanismus zu erkl�ren. Im n�chsten Kursteil wollen wir dann noch einmal genauer auf die anderen Objekte eingehen. Die OpenGL wird zur Beschreibung von Primitiven durch den Aufruf der Funktion �glBegin� in einen speziellen Zustand versetzt, in dem nur eine sehr eingeschr�nkte Anzahl der Funktionen zul�ssig ist, um die Eckpunkte von Primitiven und deren Eigenschaften (Farbe, Texturkoordinaten, Normale usw.) zu spezifizieren. Sind alle gew�nschten Primitive beschrieben, wird der Zustand durch �glEnd� wieder verlassen und es sind wieder alle Funktionen zul�ssig. Die Funktion zur Angabe der Eckpunkte hei�t �glVertex� � es gibt sie in insgesamt 24 Versionen, die die verschiedenen Datentypen von �unsigned byte� bis �double� unterst�tzen.

Ein sehr einfaches Beispiel zum Zeichnen von zwei Dreiecken finden Sie in unserem Listing. Die Funktion �glBegin� wird mit dem Parameter �GL_TRIANGLES� aufgerufen, um bekanntzugeben, da� nun Dreiecke folgen. Die Funktion �glVertex2d� erwartet je eine X- und eine Y-Koordinate (zwei Werte, daher die �2�) als �double�-Wert (daher das �d�).
Der Koordinatenbereich ist von der Einstellung der Transformationen abh�ngig und soll hier im Bereich (-1.0,-1.0) f�r die untere linke Fensterecke und (1.0,1.0) f�r die obere rechte Fensterecke liegen. Derselbe Mechanismus wird f�r alle anderen Primitive angewendet, doch dazu mehr im n�chsten Teil. Wir wollen uns zuerst noch der Tortur zuwenden, die die Vertices nach ihrer Spezifikation durchlaufen.

Die Grafik-Pipeline von OpenGL

In Bild �Pipeline� ist eine etwas vereinfachte Darstellung der OpenGL-Grafik-Pipeline zu sehen. Nachdem ein Vertex in Objektkoordinaten (seine Koordinaten in der virtuellen �Welt�) via �glVertex� angegeben wurde, wird er durch die �Modelview-Matrix� transformiert, die Kameraeinstellungen und �hnliches enth�lt. Danach erhalten wir einen Raumpunkt in sogenannten Augenkoordinaten. Hier wird der Vertex beleuchtet, bevor er eventuell an einer von bis zu sechs benutzerdefinierten Ebenen abgeschnitten wird. Anschlie�end transformiert ihn die Projektionsmatrix, die Parallelprojektionen ebenso wie Zentralprojektionen enthalten kann. Danach liegt der Raumpunkt in sogenannten Clip-Koordinaten vor � Anpassung des Vertex an die Fenstergrenzen. Nun haben wir einen Punkt in normierten Koordinaten � er liegt nun definitiv im W�rfel mit den Eckpunkten (-1,-1,-1) und (1,1,1). Daher mu� die Software den Punkt durch die �Window-Transformation� in Fensterkoordinaten umrechnen. Anschlie�end wird aus mehreren so gewonnenen Punkten das gew�nschte Primitiv (in diesem Fall ein Dreieck) erzeugt. Durch Rasterung wird es in viele �Fragmente� zerlegt.

Mit Fragment bezeichnet man in der OpenGL Pixel mit zugeh�renden Informationen (Farbe, Entfernung vom Betrachter, Texturkoordinaten usw.). Diese Fragmente durchlaufen nun ihrerseits eine Reihe von Stufen � dazu geh�rt Z-Buffer-Test und das Dithering. Am Ende der ganzen Prozedur fallen eine Menge Pixel heraus, die schlie�lich gezeichnet werden. Wie man sieht, ist trotz der Verwendung der Bibliothek immer noch eine Menge Wissen �ber dreidimensionale Grafik n�tig. Aber es ist alles halb so wild wie es zun�chst erscheint, da OpenGL viele Funktionen zur Verf�gung stellt, um komfortabel die n�tigen Einstellungen vorzunehmen. Doch dazu mehr in der n�chsten Folge, in dem die CyberGL endlich zum Einsatz kommt.
lb

Literatur:

[1] Analytische Geometrie und Lineare Algebra, Cornelsen Verlag, ISBN: 3-590-12319-2
[2] OpenGL Programming Guide, Addison Wesley Publishing Company, ISBN 0-201-63274-8

 

Kurs�bersicht

Folge 1: Grundlagen zur 3-D-Grafik. Welche Standards existieren? Was ist die OpenGL und wie arbeitet die Bibliothek.

Folge 2: Besonderheiten der CyberGL, Anwendung von CyberGL, erste Beispiele.

Folge 3: Tiefere Einblicke in die CyberGL-M�glichkeiten (Nebel, Texturemapping usw.). Anwendung von CyberGL in einem Fraktalgebirge-Programm.

Glossar

Vertex: Ein einzelner Punkt (eventuell erg�nzt um seine Farbe und weitere Informationen). Vertices sind die einfachsten geometrischen Objekte. Linien, Polygone und ganze Objekte lassen sich aus ihnen konstruieren.

Normale: Ein Vektor (bestehend aus X-, Y- und Z-Koordinate), der senkrecht auf einer (gedachten) Fl�che steht und so die Oberfl�chenrichtung der Fl�che angibt. Ein Normalenvektor hat immer die L�nge 1.

Grafik-Pipeline: Bei der Darstellung eines Polygons durchl�uft dies eine Reihe Bearbeitungsstufen. Dazu geh�ren Transformationen, Beleuchtung, Clipping, Rasterung und die Pixeloperationen (z.B. Dithering). Diese Stufen werden zusammen als Pipeline bezeichnet und durch die Hardware parallel ausgef�hrt werden.

Clipping: Fl�chen und Linien sind immer komplett sichtbar, komplett au�erhalb des Fensters oder sie schneiden den Fensterrand. Das Abschneiden von Objekten an den Fensterr�ndern nennt man Clipping.

Dithering: Oft steht nur eine begrenzte Anzahl Farben zur Verf�gung (z.B. 256), die bei weitem nicht ausreichen, um sanfte Farbverl�ufe oder bunte Texturen wiederzugeben. Daher setzt man abwechselnd Pixel mit �hnlicher Farbe nebeneinander, um eine Zwischenfarbe vorzut�uschen. Diesen Trick bezeichnet man als Dithering.

Wireframe: Drahtgitterdarstellung eines Objekts. Es werden nur die Kanten der Objektpolygone gezeichnet. Dies ist die schnellste und einfachste Art der Darstellung, da die Software keine verdeckten Kanten entfernen mu� und das Zeichnen von Linien sehr schnell geht. (s. Bild �Wireframe�)

Flatshading: Bei dieser Art der Objektdarstellung werden alle Fl�chen in ihren Fl�chenschwerpunkten beleuchtet und anschlie�end komplett in dieser Farbe gezeichnet. Da das F�llen von Fl�chen mit einer einzigen Farbe sehr einfach ist, z�hlt auch diese Art der Darstellung zu den schnelleren Varianten. Die so gezeichneten Objekte wirken jedoch sehr kantig (s. Bild �Flatshading�).

Gouraudshading: Beleuchtet man eine Fl�che an allen Eckpunkten einzeln, so kann man ein Objekt runder erscheinen lassen. Dazu werden die Fl�cheneckpunkte in der berechneten Farbe gezeichnet und alle Bildpunkte dazwischen erhalten eine �Zwischenfarbe�. Die Silhouette eines K�rpers bleibt aber auch mit diesem Trick kantig. (s. Bild �Gouraudshading�)

Antialiasing: Da jedes Pixel auf dem Bildschirm nur eine festgelegte Farbe haben kann und eine Linie oder ein Polygon fast nie exakt an den Pixelr�ndern aufh�rt, bilden sich die ber�chtigten Treppchenmuster. Mit Antialiasing r�ckt man diesem Ph�nomen zu Leibe, indem man angrenzenden Pixeln eine ��hnliche� Farbe gibt und so die harten Kontraste vertuscht. (s. Bild �Antialiasing�)

Texturemapping: Wenn ein Objekt besonders realistisch aussehen soll, mu� man sehr viele Details modellieren. Da dies jedoch sehr viel Speicher und Rechenzeit ben�tigt, kann man auch so tun als seien Details vorhanden, indem man Textur (ein Bild) auf das Objekt �klebt�. (s. Bild �Texturemapping�)

Perspektiv-Korrektur: Ohne dieses Verfahren wirken Texturen teilweise sehr verzerrt (bekannt von Spielen). Eine echte Perspektivkorrektur erfordert jedoch eine hohe Rechenleistung (zwei Divisionen pro Bildpunkt zus�tzlich).

Z-Buffer: Es gibt sehr viele verschiedene Verfahren, verdeckte Objekte aus einer Szene auszublenden. Ein sehr einfaches und besonders vielseitiges ist das Z-Buffering. Dabei merkt man sich zu jedem Pixel nicht nur dessen Farbe, sondern auch seine Entfernung vom Betrachter (seine Z-Koordinate). Soll nun ein Pixel gezeichnet werden, sieht man zun�chst nach, ob das neue Pixel n�her am Betrachter ist als das alte Pixel an der gleichen Stelle und merkt sich die neue Entfernung gegebenenfalls. Ist es weiter entfernt, passiert �berhaupt nichts, da das neue Pixel vom alten verdeckt wird. Da man sich aber f�r jedes Pixel mindestens eine 16-Bit-Zahl merken mu�, nagt das Verfahren sp�rbar am Speicher. Beispiel: 640 x 480 Pixel mit je zwei Byte Z-Buffer-Information ergibt 614400 Bytes.

Texturfilter: Wird eine Textur auf ein Polygon �geklebt�, so tritt f�r jeden Bildpunkt einer von zwei F�llen auf: es werden mehrere Texturpixel auf einen Bildpunkt oder ein Texturpixel wird auf mehrere benachbarte Bildpunkte abgebildet. Dadurch entstehen entweder Abtastfehler (Verkleinerung der Textur) oder Pixelbl�cke (Vergr��erung der Textur). Durch Texturfilter kann man diesen Effekten entgegenwirken.

Bilineare Filter: Dieser Texturfilter gl�ttet die Texturpixel durch Zwischenwerte (bilineare Interpolation). Er kommt bei nahe am Betrachter liegenden Bildpunkten zum Einsatz und l��t die Textur mit abnehmender Entfernung unsch�rfer wirken.

MIPmapping: Multum In Parvo (lat.: vieles in einem). Die Textur wird in vielen Gr��en bis hin zur Gr��e 1 mal 1 Pixel vorgefiltert abgelegt. Das Texturemapping w�hlt nun f�r jedes Pixel die passende vorgefilterte Textur aus. Dieser Filter kommt bei weit entfernten Bildpunkten zum Einsatz und l��t die Textur mit zunemhmender Entfernung weniger detailliert erscheinen.


MagnaMedia Hauptseite

� Copyright by MagnaMedia Verlag AG, Haar bei M�nchen
Ver�ffentlichung und Vervielf�ltigung nur mit schriftlicher Genehmigung des Verlags


Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 1.M�rz 1997.